// pages/cart/cart.js
/* 1 获取用户的收货地址
      1 绑定点击事件
      2 调用小程序内置 api  获取用户的收货地址  wx.chooseAddress
      3 把获取到的收货地址 存入到 本地存储中 
2 页面加载完毕
  0 onLoad  onShow 
  1 获取本地存储中的地址数据
  2 把数据 设置给data中的一个变量
3 onShow 
  0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
    1 num=1;
    2 checked=true;
  1 获取缓存中的购物车数组
  2 把购物车数据 填充到data中
4 全选的实现 数据的展示
  1 onShow 获取缓存中的购物车数组
  2 根据购物车中的商品数据 所有的商品都被选中 checked=true  全选就被选中
5 总价格和总数量
  1 都需要商品被选中 我们才拿它来计算
  2 获取购物车数组
  3 遍历
  4 判断商品是否被选中
  5 总价格 += 商品的单价 * 商品的数量
  5 总数量 +=商品的数量
  6 把计算后的价格和数量 设置回data中即可
6 商品的选中
  1 绑定change事件
  2 获取到被修改的商品对象
  3 商品对象的选中状态 取反
  4 重新填充回data中和缓存中
  5 重新计算全选。总价格 总数量。。。
7 全选和反选
  1 全选复选框绑定事件 change
  2 获取 data中的全选变量 allChecked
  3 直接取反 allChecked=!allChecked
  4 遍历购物车数组 让里面 商品 选中状态跟随  allChecked 改变而改变
  5 把购物车数组 和 allChecked 重新设置回data 把购物车重新设置回 缓存中 
8 商品数量的编辑
  1 "+" "-" 按钮 绑定同一个点击事件 区分的关键 自定义属性 
    1 “+” "+1"
    2 "-" "-1"
  2 传递被点击的商品id goods_id
  3 获取data中的购物车数组 来获取需要被修改的商品对象
  4 当 购物车的数量 =1 同时 用户 点击 "-"
    弹窗提示(showModal) 询问用户 是否要删除
    1 确定 直接执行删除
    2 取消  什么都不做 
  4 直接修改商品对象的数量 num
  5 把cart数组 重新设置回 缓存中 和data中 this.setCart
9 点击结算
  1 判断有没有收货地址信息
  2 判断用户有没有选购商品
  3 经过以上的验证 跳转到 支付页面！ 
   */
import {showModel, showToast} from '../../utils/asyncWX'
Page({

  /**
   * 页面的初始数据
   */
  data: {
    // 保存收货地址数据
    address: {},
    // 购物车数据
    cartData: [],
    // 全选按钮状态
    allChecked: false,
    // 总价格
    allPrice: 0,
    // 总数目
    allNum: 0
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
   
  },
  /**
   * 生命周期函数--监听页面显示
   */
   onShow: function () {
    const address = wx.getStorageSync('address') || [];
    address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo
    const cartData = wx.getStorageSync("cart") || [];
    this.setCart(cartData)
    this.setData({address})
  },

  // 监听添加地址
  handleAddress() {
    wx.chooseAddress({
      success: (result)=>{
        console.log(result)
        wx.setStorageSync("address", result);
      },
    });
  },
  // 封装 设置购物车状态同时 重新计算 底部工具栏的数据 全选 总价格 购买的数量
  setCart(cartData) {
     // 计算总价格
     let allPrice = cartData.filter(item => item.checked).reduce((preVal, currentVal) => preVal + currentVal.num * currentVal.goods_price, 0)
     // console.log(allPrice);
     // 计算总数量
     let allNum = cartData.filter(item => item.checked).reduce((preVal, currentVal) => preVal + currentVal.num, 0)
     // 是否全选
     let allChecked = cartData.length ? cartData.every(item => item.checked) : false
     this.setData({
      cartData,
      allPrice,
      allNum,
      allChecked
    })
    wx.setStorageSync("cart", cartData);
  },

  // 处理商品选中状态
  handleCkecked(e) {
    // console.log(e);
    // 获取到被修改的商品对象
    let {id} = e.currentTarget.dataset
    let {cartData} = this.data
    // console.log(id);
    let index = cartData.findIndex(v => v.goods_id === id)
    // console.log(index);
    cartData[index].checked = !cartData[index].checked
    // console.log(cartData);
    this.setCart(cartData)
    
  },
  // 处理全选和反选
  handleAllChecked() {
    // console.log(1);
    let {allChecked, cartData} = this.data
    allChecked = !allChecked
    cartData.forEach(item => {
      return allChecked ? item.checked = true : item.checked = false
    });
    this.setCart(cartData)
  },
  // 处理商品的编辑+ —
  async handleItemEdit(e) {
    let {id, operation} = e.currentTarget.dataset
    let {cartData} = this.data
    let index = cartData.findIndex(v => v.goods_id === id)
    // console.log(index);
    // 当购物车的数量<1时，同时点击"-"
    if(cartData[index].num === 1 && operation=== -1) {
      let res = await showModel({content: '是否删除该商品?'})
      // console.log(res);
      // 如果删除
      if(res.confirm) {
        cartData.splice(index, 1)
        this.setCart(cartData)
      } 
    } else {
      cartData[index].num += operation
      this.setCart(cartData)
    }
    
  },
  // 处理商品的结算功能
  async handlePay() {
    let {address, cartData} = this.data
    // 判断有没有收货地址信息
    if(!address.userName) {
      await showToast({title: '请填写收货地址'})
    } else if(!cartData.length) {
      await showToast({title: '请选购商品'})
    } else {
      wx.navigateTo({
        url: '/pages/pay/pay',
      });
    }
  }
})